package com.easycoding.framework.repository;

import java.io.Serializable;
import java.util.List;

import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

import com.easycoding.framework.repository.support.query.QueryInfo;
import com.easycoding.framework.support.PageMan;

/**
 * 基础Repository接口，继承JpaRepository<T, ID>, JpaSpecificationExecutor<T>,实现增、删、改、查，分页、排序等基本功能
 * @author Wangjk
 * @Version 1.0
 * @Date 2013-3-22
 * @param <T> 实体类型
 * @param <ID> 主键类型
 */
public interface BaseJpaRepository <T, ID extends Serializable> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T>{

	/**
	 * 查找第一记录
	 * @param sort 排序方式
	 * @return
	 */
	public T findTopOne(Sort sort);
	
	/**
	 * 根据条件查找第一记录
	 * @param specification
	 * @return
	 */
	public T findTopOne(Specification<T> specification);
	
	/**
	 * 根据条件查找第一记录
	 * @param specification
	 * @param sort 排序方式
	 * @return
	 */
	public T findTopOne(Specification<T> specification , Sort sort);
	
	/**
	 * 查找前N条记录
	 * @param num 记录数
	 * @param sort 排序方式
	 * @return
	 */
	public List<T> findTop(int num , Sort sort);
	
	/**
	 * 根据条件前N条记录
	 * @param num 记录数
	 * @param specification
	 * @return
	 */
	public List<T>  findTop(Specification<T> specification,int num);
	
	
	/**
	 * 根据条件前N条记录
	 * @param num 记录数
	 * @param specification
	 * @param sort 排序方式
	 * @return
	 */
	public List<T>  findTop(Specification<T> specification,int num , Sort sort);
	
	/**
	 * 分页查询
	 * @param pageMan 分页信息
	 * @return
	 */
	public List<T> findPage(PageMan pageMan);
	
	/**
	 * 分页查询
	 * @param pageMan 分页信息
	 * @param sort 排序方式
	 * @return
	 */
	public List<T> findPage(PageMan pageMan,Sort sort);
	
	/**
	 * 复杂条件分页查询
	 * @param pageMan 分页信息
	 * @return
	 */
	public List<T> findPage(Specification<T> specification,PageMan pageMan);
	
	/**
	 * 复杂条件分页查询,排序
	 * @param pageMan 分页信息
	 * @param sort 排序方式
	 * @return
	 */
	public List<T> findPage(Specification<T> specification,PageMan pageMan,Sort sort);
	
	/**
	 * 通过QueryInfo查询
	 * @param queryInfo
	 * @return
	 */
	public List<T> findByQueryInfo(QueryInfo<T> queryInfo);
}
